package com.trolls.server;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;

import org.apache.tools.ant.taskdefs.Get;
import org.jdom2.*;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

import com.trolls.client.Race;
import com.trolls.client.Troll;

public class JdomAccessData {
	// Ondéclare un nouveau document
	private static org.jdom2.Element noeudItem;
	
	public static ArrayList<Race> getRaces(String filePath) {
		ArrayList<Race> listeRaces = new ArrayList<Race>();
		Document document = initDocument(filePath);
		noeudItem = document.getRootElement().getChild("races");
		// On crée une List contenant tous les noeuds
		List<Element> listTrolls = noeudItem.getChildren();
		Iterator<Element> it = listTrolls.iterator();
		while (it.hasNext()) {
			Element courant = (Element)it.next();
			Race race =new Race(Integer.parseInt(courant.getChild("id").getText()),
					courant.getChild("name").getText(),
					courant.getChild("description").getText(),
					courant.getChild("competenceSpeciale").getText(),
					courant.getChild("competenceSpecialeSecondaire").getText(),
					courant.getChild("image").getText()
			);
			listeRaces.add(race);
		}
		return listeRaces;
	}
	public static Hashtable<String,Race> getRacesTable(String filePath) {
		Hashtable<String,Race> listeRaces = new Hashtable<String,Race>();
		Document document =initDocument(filePath);
		noeudItem = document.getRootElement().getChild("races");
		// On crée une List contenant tous les noeuds
		List<Element> listTrolls = noeudItem.getChildren();
		Iterator<Element> it = listTrolls.iterator();
		while (it.hasNext()) {
			Element courant = (Element)it.next();
			Race race =new Race(Integer.parseInt(courant.getChild("id").getText()),
					courant.getChild("name").getText(),
					courant.getChild("description").getText(),
					courant.getChild("competenceSpeciale").getText(),
					courant.getChild("competenceSpecialeSecondaire").getText(),
					courant.getChild("image").getText()
			);
			listeRaces.put(courant.getChild("id").getText(),race);
		}
		return listeRaces;
	}
	public static ArrayList<Troll> getTrolls(String filePath) {
		Document document =initDocument(filePath);
		return getTrolls(filePath,document);
	}
	private static ArrayList<Troll> getTrolls(String filePath, Document doc) {
		ArrayList<Troll> listeTrolls = new ArrayList<Troll>();
		noeudItem = doc.getRootElement().getChild("trolls");
		// On crée une List contenant tous les noeuds
		List<Element> listTrolls = noeudItem.getChildren();
		Iterator<Element> it = listTrolls.iterator();
		while (it.hasNext()) {
			Element courant = (Element)it.next();
			Hashtable<String,Race>  races=getRacesTable(filePath);
			Race race =races.get(courant.getChild("race_id").getText());
			Troll troll = new Troll(Integer.parseInt(courant.getChild("id").getText()),
					courant.getChild("name").getText(),
					race,
					courant.getChild("description").getText(),
					courant.getChild("image").getText(),
					Integer.parseInt(courant.getChild("ptsAttaque").getText()),
					Integer.parseInt(courant.getChild("ptsDegat").getText()),
					Integer.parseInt(courant.getChild("ptsEsquive").getText()),
					Integer.parseInt(courant.getChild("ptsRegeneration").getText()),
					Integer.parseInt(courant.getChild("ptsPv").getText()),
					Integer.parseInt(courant.getChild("ptsCompetenceSpecial").getText()),
					Integer.parseInt(courant.getChild("ptsCompetenceSpecialSecondaire").getText()));
			listeTrolls.add(troll);
		}
		return listeTrolls;
	}

	
	public static ArrayList<Troll> SaveTroll(Troll troll, String filePath ) {
		// Nous allons commencer notre arborescence en créant la racine XML
		//document = new org.jdom2.Document(racine);

		Document document =initDocument(filePath);
		noeudItem = document.getRootElement().getChild("trolls");
		// On crée une List contenant tous les noeuds
		List<Element> listTrolls = noeudItem.getChildren();
		boolean is_update = false;
		Iterator<Element> it = listTrolls.iterator();
		int idMax=0;
		System.out.println(listTrolls);
		while (it.hasNext()) {
			Element courant = (Element)it.next();
			idMax = maximum(idMax,Integer.parseInt(courant.getChild("id").getText()));
			if(Integer.parseInt(courant.getChild("id").getText())==troll.getId()){
				noeudItem.setContent(noeudItem.indexOf(courant), createElement(troll));
				is_update = true;
			}
		}

		//CREATION DU NOUVEAU NOEUD SI c'est une nouvelle données
		if(!is_update){
			if(troll.getId()==0){
				troll.setId(idMax+1);
			}
			Element noeudTroll = createElement(troll);
			noeudItem.addContent(noeudTroll);		
		}
		
		enregistre(filePath, document);
		return getTrolls(filePath,document);
	}
	private static int maximum(int i, int j) {
		// TODO Auto-generated method stub
		return i<j?j:i;
	}
	public static ArrayList<Troll> removeTroll(Troll troll, String filePath ) throws Exception {

		Document document =initDocument(filePath);
		noeudItem = document.getRootElement().getChild("trolls");
		// On crée une List contenant tous les noeuds trolls
		List<Element> listTrolls = noeudItem.getChildren();
		Iterator<Element> it = listTrolls.iterator();
		Element elDeleted =null;
		try{
		while (it.hasNext()) {
			Element courant = (Element)it.next();
			if(Integer.parseInt(courant.getChild("id").getText())==troll.getId()){
				it.remove();
			}
		
		}
		}catch(Exception e){
			throw e;
		}
		affiche(document);
		enregistre(filePath, document);
		
		return getTrolls(filePath,document);
		
	}

	private static Element createElement(Troll troll) {
		Element noeudTroll = new Element("troll");

		Attribute classe = new Attribute("classe",
				Character.toUpperCase("troll".charAt(0))
						+ "troll".substring(1));
		noeudTroll.setAttribute(classe);
		Element id = new Element("id");
		Element name = new Element("name");
		Element description = new Element("description");
		Element ptsAttaque = new Element("ptsAttaque");
		Element ptsDegat = new Element("ptsDegat");
		Element ptsEsquive = new Element("ptsEsquive");
		Element ptsRegeneration = new Element("ptsRegeneration");
		Element ptsPv = new Element("ptsPv");
		Element ptsCompetenceSpecial= new Element("ptsCompetenceSpecial");
		Element ptsCompetenceSpecialSecondaire= new Element("ptsCompetenceSpecialSecondaire");
		Element image = new Element("image");
		Element race_id = new Element("race_id");
		
		id.setText(String.valueOf(troll.getId()));
		name.setText(troll.getName());
		description.setText(troll.getDescription());
		
		ptsAttaque.setText(String.valueOf(troll.getPtsAttaque()));
		ptsDegat.setText(String.valueOf(troll.getPtsDegat()));
		ptsEsquive.setText(String.valueOf(troll.getPtsEsquive()));
		ptsRegeneration.setText(String.valueOf(troll.getPtsRegeneration()));
		ptsPv.setText(String.valueOf(troll.getPtsPv()));
		ptsCompetenceSpecial.setText(String.valueOf(troll.getPtsCompetenceSpecial()));
		ptsCompetenceSpecialSecondaire.setText(String.valueOf(troll.getPtsCompetenceSpecialSecondaire()));
		race_id.setText(String.valueOf(troll.getRace().getId()));
		image.setText(String.valueOf(troll.getImage()));
		
		noeudTroll.addContent(id);
		noeudTroll.addContent(name);
		noeudTroll.addContent(description);
		noeudTroll.addContent(image);
		noeudTroll.addContent(race_id);
		noeudTroll.addContent(ptsAttaque);
		noeudTroll.addContent(ptsDegat);
		noeudTroll.addContent(ptsEsquive);
		noeudTroll.addContent(ptsRegeneration);
		noeudTroll.addContent(ptsPv);
		noeudTroll.addContent(ptsCompetenceSpecial);
		noeudTroll.addContent(ptsCompetenceSpecialSecondaire);
		return noeudTroll;
	}

	public static void main(String[] args) {

	}

	static void affiche( Document doc) {
		try {
			// On utilise ici un affichage classique avec getPrettyFormat()
			XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
			sortie.output(doc, System.out);
		} catch (java.io.IOException e) {
		}
	}

	static void enregistre(String fichier, Document doc) {
		try {
			// On utilise ici un affichage classique avec getPrettyFormat()
			XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
			// Remarquez qu'il suffit simplement de créer une instance de
			// FileOutputStream
			// avec en argument le nom du fichier pour effectuer la
			// sérialisation.
			//sortie.output(document, new FileOutputStream(fichier));
			sortie.output(doc, new FileOutputStream(fichier));

		} catch (java.io.IOException e) {
		}
	}
	static private Document initDocument(String filePath){
		SAXBuilder sxb = new SAXBuilder();
		Document document = new Document();;
		try {
			document = sxb.build(new File(filePath));
		} catch (Exception e) {
		}
		return document;
	}
}
